package com.atguigu.springwebdemo.controller;

import com.atguigu.springwebdemo.bean.Employee;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

/**
 * Created by Smexy on 2022/9/7
 *
 *  @Controller: 表明当前类是一个控制器。
 *      加了这个注解，Spring容器只要扫描到了这个注解，自动为注解标识的类在容器中创建一个单例对象。
 *
 *      对项目做了任何修改，都要重启才能生效！
 *
 *   ----------------------
 *     前后端分离开发：
 *          前端人员负责页面的构造(写html页面)，负责页面的特效(js,css)。
 *                  前端页面负责和用户交互，获取用户数据之后，以json形式发送给App后端(java,python,php,go)。
 *                  后端处理后，将前端想要的数据，以json形式返回。俗称编写数据接口，写接口。
 *                  前端人员，再利用页面效果，渲染和显示数据。
 */
//@Controller
@RestController // 作用= @Controller + 为这个类的所有方法默认都标注@ResponseBody注解
public class HelloController
{

    /*
           RequestMapping 标注在方法或类上。
                标注在方法上，作用是，标识当前方法可以处理的请求路径是什么


           不限定请求方式！


     */
    @RequestMapping(value = "/hello")
    public String handle1(){

        System.out.println("后台的App已经收到了用户的请求!");

        //将希望给浏览器返回的页面作为返回值返回即可
        /*
                /: 当前web项目的static根目录
         */
        return "/success.html";

    }

    /*
            接收页面传入的参数，只需要在方法的形参位置声明和页面的参数name同名的形参即可。

            /sendParam?name=jack&age=20

     */
    @RequestMapping(value = "/sendParam")
    public String handle2(String name,String age){

        System.out.println("后台的App已经收到了用户的参数: name:" + name +", age:" + age);

        return "/success.html";

    }

    /*
            如果返回数据给前端，要加@ResponseBody。

            @ResponseBody： 把方法的返回值，直接写入响应体，返回给浏览器。
                    返回值是基本数据类型+string，不做任何处理。
                    返回值以非以上类型，将数据转换为json格式，再返回。
     */
    //@ResponseBody
    @RequestMapping(value = "/requestSimpleData")
    public String handle3(){

        System.out.println("后台的App开始返回数据给前端");

        return "success";

    }

    //@ResponseBody
    @RequestMapping(value = "/requestComplexData")
    public Object handle4(){

        Employee employee = new Employee(1, "jack", "male", "jack@163.com");

        return employee;

    }

    /*
            只允许次方法处理 来自于 指定Url的get请求

              如果url对上了，但是请求方式对不上，报错405:
                    There was an unexpected error (type=Method Not Allowed, status=405).
     */
    //@GetMapping(value = "/onlyGet")
    @PostMapping(value = "/onlyGet")
    public Object handle5(){

        Employee employee = new Employee(1, "jack", "male", "jack@163.com");

        return employee;

    }

    /*

{
    "id": 1,
    "lastName": "jack",
    "gender": "male",
    "email": "jack@163.com"
}
            前端传入的就是一个json，发送POST请求，后台如何接收。
                后端可以使用Map接收，也可以直接使用Bean接收

                @RequestBody 把请求体中的内容直接赋值给标注注解的参数类型
     */
    @PostMapping(value = "/getJson")
    public Object handle6(@RequestBody Employee e){

        System.out.println("收到了"+e);

        return "success";

    }

    /*
            如果想获取路径上填充的内容，只需要在路径对应的位置声明 { 自自定义一个参数名  }

            @PathVariable("hahaha"): 将路径上的 hahaha占位符获取的值，赋值给某个形参
     */
    @GetMapping(value = "/requestPathVariavle/{hahaha}/bbb")
    public Object handle7(@PathVariable("hahaha") String a){

        System.out.println("收到了:"+a);

        return "success";

    }

    public void  hello(){
        System.out.println("hello");
    }
}
